package top.smallway.lightbandassistant_app.UI;

import static top.smallway.lightbandassistant_app.UI.MainActivity.loginManager;
import static top.smallway.lightbandassistant_app.method.Method.isValidEmail;

import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import top.smallway.lightbandassistant_app.R;
import top.smallway.lightbandassistant_app.network.LoginManager;

/**
 * 用户注册页面
 * 负责处理新用户注册功能，包括用户名、密码和邮箱的输入验证
 * 实现用户协议勾选和注册请求的处理
 */
public class RegisterActivity extends AppCompatActivity {
    // 邮箱输入布局，包含输入框和提示信息
    private TextInputLayout email_text;
    // 用户名输入框，用于输入注册用户名
    private TextInputEditText username;
    // 密码输入框，用于输入注册密码
    private TextInputEditText password;
    // 邮箱输入框，用于输入注册邮箱
    private TextInputEditText email;
    // 注册按钮，点击触发注册操作
    private Button reg;
    // 用户协议勾选框，必须同意才能注册
    private CheckBox check;

    /**
     * Activity创建时的初始化
     * 设置页面布局、初始化视图组件
     * 配置邮箱输入验证和注册按钮点击事件
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.register);
        initview();
        reg.setEnabled(false);
        check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                reg.setEnabled(isChecked);
            }
        });
        // 添加邮箱输入框的文本变化监听器
        // 用于实时验证邮箱格式的正确性
        email.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                email_text.setHelperText("在此输入你的Email，未来可用于找回密码");
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (!isValidEmail(String.valueOf(s))) {
                    email_text.setError("请输入正确的Email!");
                }

            }

            @Override
            public void afterTextChanged(Editable s) {
                if (!isValidEmail(String.valueOf(s))) {
                    email_text.setError("请输入正确的Email!");
                }
            }
        });

        // 注册按钮点击事件监听器
        // 验证输入信息完整性，执行注册请求，处理注册结果
        reg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (username.getText().toString().isEmpty() && password.getText().toString().isEmpty() && email.getText().toString().isEmpty()) {
                    Toast.makeText(RegisterActivity.this, "以上三项为必填项，请勿为空！", Toast.LENGTH_SHORT).show();
                } else {
                    String user = username.getText().toString();
                    String pass = password.getText().toString();
                    String mail = email.getText().toString();
                    // 创建新线程执行注册请求
                    // 避免在主线程进行网络操作
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            loginManager.register(user, pass, mail, new LoginManager.RegStatus() {
                                // 注册成功的回调处理
                                @Override
                                public void RegSuccess() {
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            Toast.makeText(RegisterActivity.this, "注册成功！", Toast.LENGTH_SHORT).show();
                                        }
                                    });
                                    finish();
                                }

                                // 注册失败的回调处理
                                // 根据错误码显示相应的错误信息
                                @Override
                                public void RegFailed(int code) {
                                    switch (code) {
                                        case 401:
                                            runOnUiThread(new Runnable() {
                                                @Override
                                                public void run() {
                                                    Toast.makeText(RegisterActivity.this, "用户名或邮箱已被注册，请选择不同的用户名或邮箱。", Toast.LENGTH_SHORT).show();
                                                }
                                            });
                                            break;
                                        case 500:
                                            runOnUiThread(new Runnable() {
                                                @Override
                                                public void run() {
                                                    Toast.makeText(RegisterActivity.this, "未知错误！", Toast.LENGTH_SHORT).show();
                                                }
                                            });
                                            break;
                                        default:
                                            runOnUiThread(new Runnable() {
                                                @Override
                                                public void run() {
                                                    Toast.makeText(RegisterActivity.this, "未知错误!错误代码：" + code, Toast.LENGTH_SHORT).show();
                                                }
                                            });
                                    }
                                }
                            });

                        }
                    }).start();
                }
            }
        });
    }

    /**
     * 初始化视图组件
     * 绑定布局文件中的各个UI组件
     */
    private void initview() {
        email_text = findViewById(R.id.email_text);
        username = findViewById(R.id.username);
        password = findViewById(R.id.password);
        email = findViewById(R.id.email);
        reg = findViewById(R.id.reg);
        check = findViewById(R.id.check);
    }

    /**
     * 验证邮箱格式是否正确
     * @param email 待验证的邮箱地址
     * @return 返回邮箱格式是否有效
     */
    /**
     * 验证邮箱格式是否正确
     * 使用正则表达式验证邮箱地址的格式
     * @param email 待验证的邮箱地址字符串
     * @return 如果邮箱格式正确返回true，否则返回false
     */
    private boolean isValidEmail(String email) {
        String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
        Pattern pattern = Pattern.compile(emailRegex);
        Matcher matcher = pattern.matcher(email);
        return matcher.matches();
    }
}